package com.mh.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mh.dto.R;
import com.mh.dto.vo.LoginDataReturn;
import com.mh.dto.vo.LoginVo;
import com.mh.pojo.UserInfo;
import com.mh.service.UserInfoService;
import com.mh.utils.JWTUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.net.http.HttpHeaders;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用户信息表(UserInfo)表控制层
 *
 * @author zmh
 * @since 2024-09-02 17:22:05
 */
@RestController
@Slf4j
@CrossOrigin
@RequestMapping("/userInfos")
@RequiredArgsConstructor
public class UserInfoController {

    /**
     * 服务对象
     */
    private final UserInfoService userInfoService;


    /**
     * 登录接口
     * @param loginArgs 登录参数-邮箱-密码
     * @param response 设置响应头
     * @return ·
     */
    @PostMapping("/login")
    public R<String> login(@RequestBody LoginVo loginArgs, HttpServletResponse response){
        Map<String, Object> resultMap = userInfoService.loginCheck(loginArgs);
        if (resultMap.size() > 1){
            // 将token添加入响应头以及返回用户信息
            response.addHeader("Access-Control-Expose-Headers",JWTUtils.header);
            response.setHeader(JWTUtils.header, (String) resultMap.get("token"));
            return R.success(resultMap.get("userInfo").toString());
        }
        log.info("用户登录失败，登录邮箱：{}，时间：{}",loginArgs.getEmail(), LocalDateTime.now());
        return R.loginError();
    }

    /**
     * 检查传入ID是否为用户ID
     * @param userId id
     * @return 检查结果
     */
    @GetMapping("/checkId")
    Boolean checkId(String userId){
        return userInfoService.checkId(userId);
    }

    /**
     * 根据用户ID查询用户名称
     * @param userId `
     * @return `
     */
    @GetMapping("/getNameByUserId")
    public R<String> getUserNameByUserId(String userId){
        return userInfoService.getNameByUserId(userId);
    }

    /**
     * 分页查询
     *
     * @param page 查询页数
     * @param size 一页显示条数
     * @return ·
     */
    @GetMapping("/page")
    public R<Page<UserInfo>> getAllByPage(int page, int size) {
        //执行查询
        return userInfoService.getAllByPage(page, size);
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R<UserInfo> selectOne(@PathVariable Serializable id) {
        return R.success(this.userInfoService.getById(id));
    }

    /**
     * 根据邮箱搜索用户信息 - 搜索添加用户操作
     * @param email 搜索邮箱
     * @return 排查password字段的用户信息DTO对象
     */
    @GetMapping("/getUserByEmail/{email}")
    public R<LoginDataReturn> getUserByEmail(@PathVariable String email){
        UserInfo sourceUserInfo = userInfoService.getUserByEmail(email);

        // 拷贝用户信息对象 - 将不包含password字段的DTO对象返回
        LoginDataReturn loginDataReturn = new LoginDataReturn();
        BeanUtils.copyProperties(sourceUserInfo, loginDataReturn);

        if(sourceUserInfo.getEmail() == null || sourceUserInfo.getEmail().equals("")){
            return R.error("搜索用户不存在");
        }

        // 返回搜索结果
        return R.success(loginDataReturn);
    }
    /**
     * 新增数据-注册
     *
     * @param userInfo 实体对象
     * @param code 邮箱验证码
     * @return 新增结果
     */
    @PostMapping("/register/{verificationCode}")
    public R<String> insert(@RequestBody UserInfo userInfo, @PathVariable("verificationCode") String code) {
        return userInfoService.addUser(userInfo,code);
    }

    /**
     * 修改数据
     *
     * @param userInfo 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R<String> update(@RequestBody UserInfo userInfo) {
        return R.success(this.userInfoService.updateById(userInfo) + "");
    }

    /**
     * 删除数据
     *
     * @param id 主键结合
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public R<String> delete(@PathVariable("id") String id) {
        return R.success(this.userInfoService.removeById(id) + "");
    }
}

